package com.lihua.project.taskcenter.taskcenter.service.impl;

import java.util.Date;
import java.util.List;

import com.lihua.common.utils.DateUtils;
import com.lihua.common.utils.SystemCountUtils;
import com.lihua.project.system.user.domain.User;
import com.lihua.project.taskcenter.core.utils.TaskListUtils;
import com.lihua.project.system.score.domain.TsScore;
import com.lihua.project.system.score.mapper.TsScoreMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.RedisSystemException;
import org.springframework.stereotype.Service;
import com.lihua.project.taskcenter.taskcenter.mapper.TaskMapper;
import com.lihua.project.taskcenter.taskcenter.domain.Task;
import com.lihua.project.taskcenter.taskcenter.service.ITaskService;
import com.lihua.common.utils.text.Convert;

import static com.lihua.common.utils.security.ShiroUtils.getSysUser;

/**
 * 任务 Service业务层处理
 *
 * @author lihua
 * @date 2022-03-08
 */
@Service
@Slf4j
public class TaskServiceImpl implements ITaskService {
    @Autowired
    private TaskMapper taskMapper;

    @Autowired
    private TsScoreMapper tsScoreMapper;

    @Autowired
    private SystemCountUtils systemCountUtils;

    /**
     * 查询任务 
     *
     * @param id 任务 主键
     * @return 任务 
     */
    @Override
    public Task selectTaskById(Long id) {
        return taskMapper.selectTaskById(id);
    }

    /**
     * 查询任务 列表
     *
     * @param task 任务 
     * @return 任务 
     */
    @Override
    public List<Task> selectTaskList(Task task) {
        return taskMapper.selectTaskList(task);
    }

    /**
     * 新增任务 
     *
     * @param task 任务 
     * @return 结果
     */
    @Override
    public int insertTask(Task task) {
        task.setCreateTime(DateUtils.getNowDate());
        // 取身份信息
        User user = getSysUser();
        task.setUserId(user.getUserId());
        task.setStatus("1");
        task.setMatchStatus(0);
        log.debug("Task={}", task);

        int index = taskMapper.insertTask(task);
        //如果插入数据库成功，将新发布的任务加入匹配队列
        if (index==1){
            TaskListUtils.addTask(task);
        }
        //为任务划分评分阶段,划分为三个阶段
        Date finishDate = task.getFinishDate();
        Date createTime = task.getCreateTime();
        long  allTime= finishDate.getTime()-createTime.getTime();
        long  firstTime = createTime.getTime()+allTime/3;
        long  secondTime = createTime.getTime()+allTime/3*2;
        tsScoreMapper.insertTsScore(new TsScore(task.getId(),"第一阶段",10.0,"0",new Date(firstTime),finishDate,createTime));
        tsScoreMapper.insertTsScore(new TsScore(task.getId(),"第二阶段",10.0,"0",new Date(secondTime),finishDate,new Date(createTime.getTime()+allTime/3)));
        tsScoreMapper.insertTsScore(new TsScore(task.getId(),"第三阶段",10.0,"0",finishDate,finishDate,new Date(createTime.getTime()+allTime/3*2)));

        try{
            //统计新增任务
            systemCountUtils.addQuantity("task-count");
        }catch (RedisSystemException e){
            //异常重试
            systemCountUtils.addQuantity("task-count");
        }
        return index;
    }

    /**
     * 修改任务 
     *
     * @param task 任务 
     * @return 结果
     */
    @Override
    public int updateTask(Task task) {
        task.setLastEditDate(DateUtils.getNowDate());
        return taskMapper.updateTask(task);
    }

    @Override
    public int updateTaskMatchStatus(Task task) {
        //1、判断双方是否都确认匹配，如果是，那么修改任务状态为：进行中
        Long id = task.getId();
        Task task1 = taskMapper.selectTaskById(id);
        Task taskLink = taskMapper.selectTaskById(task1.getTaskLinkId());
        if (taskLink!=null){
            //如果链接任务已经确认匹配，那么可以将两个任务绑定
            if (taskLink.getMatchStatus()==1){
                //1、修改任务的任务状态和匹配状态
                task.setStatus("3");
                task.setTaskLinkId(task1.getTaskLinkId());
                taskMapper.updateTask(task);
                //2、修改链接任务的状态
                taskLink.setStatus("3");
                taskLink.setTaskLinkId(task1.getId());
                taskMapper.updateTask(taskLink);
                return 1;
            }else {
              return  taskMapper.updateTask(task);
            }
        }
        return 0;
    }

    /**
     * 批量删除任务 
     *
     * @param ids 需要删除的任务 主键
     * @return 结果
     */
    @Override
    public int deleteTaskByIds(String ids) {
        int index = taskMapper.deleteTaskByIds(Convert.toStrArray(ids));
        if (index==1){
            String[] strIds = Convert.toStrArray(ids);
            for (int i = 0; i < strIds.length; i++) {
                Task task = taskMapper.selectTaskById(Long.parseLong(strIds[i]));
                if (task.getStatus().equals("1")){
                    //如果任务正在匹配中，那么从匹配队列中移除删除的任务
                    TaskListUtils.deleteTasksByTasksId(Long.parseLong(strIds[i]));
                }
            }
            return 1;
        }
        return 0;
    }

    /**
     * 删除任务 信息
     *
     * @param id 任务 主键
     * @return 结果
     */
    @Override
    public int deleteTaskById(Long id) {
        return taskMapper.deleteTaskById(id);
    }

    @Override
    public List<Task> selectTaskByStatus(String status) {
        return taskMapper.selectTaskByStatus(status);
    }

    @Override
    public int updateTaskStatusAndTaskLinkId(Task task) {
        return taskMapper.updateTaskStatusAndTaskLinkId(task);
    }

    /**
     * 更换匹配任务
     *
     */
    @Override
    public int replaceTask(Task task) {
        Long taskId = task.getId();
        Task task1 = taskMapper.selectTaskById(taskId);
        //1、修改任务信息
        int index = taskMapper.updateTask(task);
        Long taskLinkId = task1.getTaskLinkId();
        //2、重新将任务加入匹配队列
        if (index==1){
            task1.setStatus("1");
            task1.setMatchStatus(0);
            task1.setTaskLinkId(-1L);
            TaskListUtils.addTask(task1);
        }
        if (taskLinkId!=-1){
            //3、修改链接任务信息
            task.setId(taskLinkId);
            int index1 = taskMapper.updateTask(task);
            //4、重新将任务加入匹配队列
            if (index1==1){
                Task task2 = taskMapper.selectTaskById(taskLinkId);
                TaskListUtils.addTask(task2);
            }
            return index1;
        }
        return index;
    }
}
